<?php
class Historiales_planes extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Afiliado :: Planes';
	var $nombre_entidad = 'Historial';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'afiliados/'; 	// Directorio donde están contenidas las vistas gestionadas por el controlador
	var $CARPETA_VISTAS_PRESTADOR = 'prestador/';
	var $pagina_editar; 					// Nombre de la vista de edición
	var $pagina_ver;

	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_ver .= $this->CARPETA_VISTAS;
    	$this->pagina_editar .= $this->CARPETA_VISTAS;
    	
    	if($this->template->usuarioActualEsPrestador())
    	{
	    	$this->pagina_ver .= $this->CARPETA_VISTAS_PRESTADOR;
    	}
    	$this->pagina_editar .= 'historial_plan_edit_view';
    	$this->pagina_ver .= 'historial_plan_ver_view';

    	$this->load->library('util_historial_plan');
	}
	
	public function nuevo($id_afiliado)
	{
		$dataView['title'] = 'Agregar Plan';
		$dataView['id_elemento'] = NULL; 	// IMPORTANTE: debe ser nulo para uno nuevo

		$this->_cargarFormEdicion($dataView, $id_afiliado);
	}

	private function _cargarFormEdicion($dataView, $id_afiliado, $cargaCompleta = FALSE)
	{
		if(!isset($dataView['obj'.$this->nombre_entidad]))
		{
			$id_elemento = $dataView['id_elemento'];

			// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
			$obj_historial = new Historial_plan($id_elemento);
			$dataView['obj'.$this->nombre_entidad] = $obj_historial;
		}

		$obj_afiliado = new Afiliado($id_afiliado);
		$dataView['objAfiliado'] = $obj_afiliado;

		$obj_afiliado->animal->get();
		$obj_afiliado->animal->raza->get();

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_plan = new Plan();
		$obj_plan->where('especie_id', $obj_afiliado->animal->raza->especie_id);
		$obj_plan->where('vigencia_desde <=', date('Y-m-d'));
		$obj_plan->where("(fecha_baja = NULL OR fecha_baja = '0000-00-00')");
		$dataView['listado_planes'] = $obj_plan->get_iterated();

		if($cargaCompleta) $dataView['modalDesactivado'] = TRUE;

		parent::_loadViews($this->pagina_editar, $dataView, $cargaCompleta);
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Se obtienen los datos del formulario para poblar el modelo
		$id_hist_plan = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$obj_hist_plan = new Historial_plan($id_hist_plan);
		$obj_hist_plan->fecha_inicio = $this->input->post('txt_fecha_inicio');

		// Defino el objeto que se desea asociar
		$id_plan = is_numeric($this->input->post('txt_plan')) ? $this->input->post('txt_plan') : NULL;
		$obj_plan = new Plan($id_plan);

		$id_afiliado = is_numeric($this->input->post('txt_afiliado')) ? $this->input->post('txt_afiliado') : NULL;

		$error_guardar = $this->_guardadoPermitido($id_afiliado, $obj_hist_plan->fecha_inicio, $obj_plan->cant_meses_duracion);
		if($error_guardar == '')
		{
			$obj_afiliado = new Afiliado($id_afiliado);

			$objetos_asociar[] = $obj_plan;
			$objetos_asociar[] = $obj_afiliado;

			// Se manejan transacciones para interactuar con la BD
			$obj_hist_plan->trans_begin();
			$operacion_exitosa = $obj_hist_plan->save($objetos_asociar); #Guardo el elemento nuevo y sus relaciones
			if(!$operacion_exitosa && !$obj_hist_plan->valid) // Falló la validación de datos
			{
				// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
				$dataView['obj'.$this->nombre_entidad] = $obj_hist_plan;
				$dataView['error'] = $obj_hist_plan->error->string;
				$this->_cargarFormEdicion($dataView, $id_afiliado, TRUE);
			}
			else
			{
				if ($obj_hist_plan->trans_status() === FALSE) // Se chequea el estado de la transacción
				{
				    $obj_hist_plan->trans_rollback(); // Si la transacción falló, hago un rollback
				}
				else
				{
				    $obj_hist_plan->trans_commit(); // Transacción exitosa, realizo el commit
				    $dataView['error'] .= $this->_generarCuotas($obj_hist_plan);
				}

			    $dataView['error'] .= $obj_hist_plan->error->string; // Almaceno todos los errores que hubieran podido ocurrir
				redirect('afiliados/ver/' . $obj_hist_plan->afiliado_id);
			}
		}
		else
		{
			// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
			$dataView['error'] = $error_guardar;
			$dataView['path_volver'] = 'afiliados/ver/' . $id_afiliado;
			parent::_loadViews($this->template->getErrorMessageView(), $dataView);
		}		
	}

	private function _guardadoPermitido($id_afiliado, $fecha_inicio_nuevo, $cant_meses_duracion)
	{
		$fecha_inicio_nuevo = $this->util_fechas->prepararFecha($fecha_inicio_nuevo);
		$cant_meses_duracion = $cant_meses_duracion - 1;
		$fecha_fin_nuevo = (strtotime('+'.$cant_meses_duracion.' month', strtotime($fecha_inicio_nuevo)));

		/* Sólo puedo asociar un plan a un afiliado si la fecha de vigencia del nuevo plan no se solapa con la 
		de ningún otro. Es decir, en un momento dado no puede haber más de un plan vigente.
		Para ello busco todos los planes que finalizan LUEGO de la fecha de inicio del nuevo plan y cuyo inicio sea
		PREVIO a la finalización del nuevo plan. Si existe alguno, el nuevo plan no puede guardarse ya que se solaparía
		con algún otro previo*/
		$obj_hist_plan = new Historial_plan();
		$obj_hist_plan->where('afiliado_id', $id_afiliado);
		$obj_hist_plan->where("DATE_ADD(fecha_inicio, INTERVAL(SELECT (cant_meses_duracion - 1) FROM 
			tbl_planes WHERE id = tbl_historial_planes.plan_id) MONTH) >", $fecha_inicio_nuevo);
		$obj_hist_plan->where('fecha_inicio <', $fecha_fin_nuevo);
		
		if($obj_hist_plan->count() > 0) return "No se puede guardar el plan ya que existen otros cuya vigencia se solapa con la del que se desea registrar."; 
		else return '';
	}

	private function _generarCuotas($objHistorialPlan)
	{
		$error = '';
		$objHistorialPlan->plan->get();

		$objCuota = new Cuota();
		$objCuota->trans_begin();

		// Se genera una cuota para cada mes a partir del periodo de inicio
		$cantCuotasGeneradas = 0;
		$periodo = $this->util_historial_plan->obtenerPeriodo($objHistorialPlan->fecha_inicio);
		$cantCuotas = $objHistorialPlan->plan->cant_meses_duracion;
		$importe_cuota = $objHistorialPlan->plan->importe_cuota;
		while ($cantCuotasGeneradas < $cantCuotas) {
			$objCuota->id = NULL;
			$objCuota->periodo = $periodo;
			$objCuota->importe = $importe_cuota;
			$objCuota->save($objHistorialPlan);
			
			$cantCuotasGeneradas += 1;
			$periodo = $this->util_historial_plan->getProximoPeriodo($periodo);
		}

		if ($objCuota->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $objCuota->trans_rollback(); // Si la transacción falló, hago un rollback
		    $error = $objCuota->error->string;
		}
		else
		{
		    $objCuota->trans_commit(); // Transacción exitosa, realizo el commit
		}

		return $error;
	}

	public function _eliminar($id_elemento)
	{
		$dataView['title'] = 'Eliminar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Se obtiene el objeto que se desea eliminar
		$obj_hist_plan = new Historial_plan($id_elemento);
		$id_afiliado = $obj_hist_plan->afiliado_id;
		
		// Se manejan transacciones para interactuar con la BD
		$obj_hist_plan->trans_begin();
		$obj_hist_plan->delete();
		if ($obj_hist_plan->trans_status() === FALSE) // Se chequea el estado de la transacción
		{
		    $obj_hist_plan->trans_rollback(); // Si la transacción falló, hago un rollback
		}
		else
		{
		    $obj_hist_plan->trans_commit(); // Transacción exitosa, realizo el commit
		}

		$dataView['error'] = $obj_hist_plan->error->string; // Almaceno todos los errores que hubieran podido ocurrir
		redirect('afiliados/ver/' . $id_afiliado);
	}

	public function ver($id_hist_plan, $dataView = array())
	{
		$dataView['title'] = 'Ver Plan';

		$obj_hist_plan = new Historial_plan($id_hist_plan);
		$dataView['obj' . $this->nombre_entidad] = $obj_hist_plan;

		$hist_plan_actual = $this->util_historial_plan->getIdHistorialPlanActual($obj_hist_plan->afiliado_id);
		$dataView['plan_actual'] = $hist_plan_actual == $obj_hist_plan->id;

		$array_prestaciones = $this->util_historial_plan->getDetallePrestaciones($obj_hist_plan);
		$dataView['prestaciones_pendientes'] = $array_prestaciones['pendientes'];
		$dataView['prestaciones_pendientes_extras'] = $array_prestaciones['pendientes_extra'];
		$dataView['prestaciones_consumidas'] = $array_prestaciones['consumidas'];

		$obj_cuota = new Cuota();
		$obj_cuota->where('historial_plan_id', $obj_hist_plan->id);
		$dataView['listado_cuotas'] = $obj_cuota->get_iterated();

		parent::_loadViews($this->pagina_ver, $dataView);
	}
}